// Package dumplite
// @Author: zhangdi
// @File: dump
// @Version: 1.0.0
// @Date: 2023/8/7 16:33
package dumplite

import (
	"fmt"
	"gorm.io/gorm"
	"os"
)

type TableInfo struct {
	Name string
	SQL  string
}

func exportSchema(db *gorm.DB, filepath string) error {
	var tables []TableInfo

	// 获取所有表结构
	err := db.Raw("SELECT name, sql FROM sqlite_master WHERE type='table'").Scan(&tables).Error
	if err != nil {
		return err
	}

	// 创建文件
	file, err := os.Create(filepath)
	if err != nil {
		return err
	}
	defer file.Close()

	// 写入表结构
	for _, table := range tables {
		_, err = file.WriteString(table.SQL + ";\n")
		if err != nil {
			return err
		}
	}

	return nil
}

func exportData(db *gorm.DB, filepath string) error {
	allTables := make([]string, 0)

	// 获取所有表名
	result := db.Raw("SELECT name FROM sqlite_master WHERE type='table'").Scan(&allTables)
	if result.Error != nil {
		return result.Error
	}

	// 创建文件
	file, err := os.Create(filepath)
	if err != nil {
		return err
	}
	defer file.Close()

	// 遍历所有表，将数据写入文件
	for _, tableName := range allTables {
		// 查询表中的数据
		tableRows, err := db.Table(tableName).Rows()
		if err != nil {
			return err
		}
		defer tableRows.Close()

		// 写入数据
		for tableRows.Next() {
			data := make(map[string]interface{})
			err = db.ScanRows(tableRows, &data)
			if err != nil {
				return err
			}

			// 生成INSERT语句
			tableName = fmt.Sprintf("%s", tableName)
			insertStatement := db.Model(data).Table(tableName).Create(data)

			_, err = file.WriteString(fmt.Sprintf("%v", insertStatement.Statement.SQL.String()) + ";\n")
			if err != nil {
				return err
			}
		}
	}

	return nil
}
